class Solution 
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur = 0, dest = -1;
        int sz = arr.size();

        // 1.找最后一个元素
        while(cur < sz)
        {
            if(arr[cur]) ++dest;
            else dest += 2;

            if(dest >= sz - 1) break;

            ++cur;
        }

        // 2.处理边界情况 -- 复写的最后一个元素为0
        if(dest == sz)
        {
            arr[sz - 1] = 0;
            --cur;
            dest -= 2;
        }

        // 3.从后往前复写操作
        while(cur >= 0) 
        {
            if(arr[cur]) arr[dest--] = arr[cur--];
            else
            {
                // arr[dest--] = arr[cur];
                // arr[dest--] = arr[cur];
                arr[dest--] = 0;  // 复写零
                arr[dest--] = 0;
                --cur;
            }
        }
    }
};